package com.egghiro.j2se.game.scardbattle.model.character.monster;

import com.egghiro.framework.j2se.game.core.model.actor.IActor;
import com.egghiro.j2se.game.scardbattle.controller.action.ai.MonsterAI;
import com.egghiro.j2se.game.scardbattle.controller.action.ai.RateMonsterAI;
import com.egghiro.j2se.game.scardbattle.model.character.GameCharacter;
import com.egghiro.j2se.game.scardbattle.view.console.CardBattleConsoleView;

public abstract class Monster extends GameCharacter implements IActor {
    private String name;
    private int mp;
    // 倒されたときのEXP?⇒Monsterを味方にするときに、別のクラスを作るか？⇒なんか違うな。
    // ⇒かといって、味方になったMonsterはもう敵にはならないので、敵用の属性は無駄になる
    // ⇒でも同じ属性に違う意味合いを持たせるのも嫌
    private int exp;
    private int gold;
    private MonsterAI monsterAI;

    public int getMp() {
        return mp;
    }

    public void setMp(int mp) {
        this.mp = mp;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setExp(int exp) {
        this.exp = exp;
    }

    public int getExp() {
        return exp;
    }

    public int getGold() {
        return gold;
    }

    public void setGold(int gold) {
        this.gold = gold;
    }

    protected MonsterAI getAI() {
        if (this.monsterAI == null) {
            this.monsterAI = this.createDefaultAI();
        }
        return monsterAI;
    }

    public void setAI(MonsterAI monsterAI) {
        this.monsterAI = monsterAI;
    }

    /**
     * デフォルトアクション
     */
    public Monster() {
    }

    public Monster(String name, int hp, int mp, int exp, int gold) {
        this.name = name;
        this.hp = hp;
        this.mp = mp;
        this.exp = exp;
        this.gold = gold;
    }

    /**
     * デフォルトアクションを生成する。 <br>
     * サブクラスでこのメソッドをOverrideして、正しいデフォルトアクションを返す。
     */
    protected MonsterAI createDefaultAI() {
        return new RateMonsterAI(this);
    }

    public abstract int attack(GameCharacter target);
    
    public abstract int magic(GameCharacter target);

    // public abstract GameCharacters target(); //TODO
    // Characters必要⇒攻撃相手が複数人とか⇒攻撃によってターゲットの選び方も違うからその攻撃のActionでターゲットを決める？ TODO

    public GameCharacter target() {
        // TODO
        return CardBattleConsoleView.getInstance().getSoldier();
    }

    @Override
    public void act() {
        this.getAI().act();
    }

}
